package com.yufan.frame.netty.netty.chat;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.CharsetUtil;
import io.netty.util.concurrent.GlobalEventExecutor;

/**
 * 自定义Handler需要继承netty规定好的某个HandlerAdapter(规范)
 */
public class NettyServerHandler  extends ChannelInboundHandlerAdapter {

    private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    /**
     * 客户端服务端连接完成出发
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        channelGroup.writeAndFlush("【客户端】"+ ctx.channel().remoteAddress() + " 上线了 ");
        // 将channel添加到group
        channelGroup.add(ctx.channel());

    }

    /**
     * 客户端与服务端离线了
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        channelGroup.remove(ctx.channel());
        channelGroup.writeAndFlush("【客户端】"+ ctx.channel().remoteAddress() + " 下线了 ");
    }

    /**
     * 读取客户端发送的数据
     * @param msg 消息
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        channelGroup.forEach(channel -> {
            if (ctx.channel() == channel) {
                channel.writeAndFlush("【自己】 发送了消息"+msg);
            } else {
                channel.writeAndFlush("【客户端】 "+msg);
            }
        });
    }


    /**
     * 处理异常, 一般是需要关闭通道
     * @param ctx 上下文
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
